package list;

import java.util.Arrays;

/*
 * 手写 ArrayList
 */
public class MyArrayList<T> {
    private Object[] elementData = {};
    private int size = 0;
    public MyArrayList(){
    }
    /*
     * 1. 第一次添加元素时候, 创建长度为10个元素的数组
     * 2. 每次添加以后 errysize 增加 1
     * 3. 增加成功返回true
     * 4. 第二次添加时候按照顺序添加到数组中
     * 5. 如果数组满了, 就扩容1.5倍
     */
    public boolean add(T e){
        //如何判断第一次添加?
        if (size==0){
            elementData = new Object[10];
        }
        //如何判断数组是否满了?
        ensureCapacity();
        elementData[size++]=e;
        return true;
    }
    public T get(int index){
        return (T)elementData[index];
    }

    @Override
    //[Tom, Jerry, Andy, Mac, Wang, Fan, Zhao, John, Lee, Andy, Robin]
    public String toString() {
        if (size==0){
            return "[]";
        }
        StringBuilder buf = new StringBuilder("[");
        buf.append(elementData[0]);
        for(int i=1; i<size; i++){
            buf.append(", ").append(elementData[i]);
        }
        return buf.append("]").toString();
    }
    //确认(ensure)容量Capacity, 确认当前数组是否能够继续添加数据,如果容量不够就扩容1.5倍
    private void ensureCapacity(){
        if(size==elementData.length){
            //Capacity: 容量
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity>>1);
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    }

    public boolean add(int index, T e){
        if(index<0 || index > size) { //如果超过插入范围就抛出异常
            throw new IndexOutOfBoundsException("index:" + index);
        }
        //如果在最后位置插入,就认为是追加
        if(index == size){ return add(e); }
        //先检查容量是否够,如果不够,就先扩容再追加
        ensureCapacity();
        //元素向后移动
        for(int i=size-1; i>=index; i--){
            elementData[i+1] = elementData[i];
        }
        //插入元素
        elementData[index] = e;
        size++; //增加了新元素以后, size 要增加 1
        return true;
    }

    public T remove(int index){
        return null;
    }

    public int indexOf(T e){
        return 0;
    }

}






